package comgame.scenes;

import com.almasb.fxgl.app.scene.FXGLScene;
import com.almasb.fxgl.audio.AudioPlayer;
import com.almasb.fxgl.audio.Sound;
import com.almasb.fxgl.dsl.FXGL;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.control.Label;

import java.util.Objects;

public class MapScene extends FXGLScene {
    private Pane sceneRoot;
    private LevelData levelData;

    public MapScene() {
        // 在构造函数中立即隐藏player实体，避免时序问题
        if (comgame.scenes.GameScene.playerEntity != null) {
            comgame.scenes.GameScene.playerEntity.getViewComponent().setVisible(false);
        }
        levelData = LevelData.getInstance();
        initUI();
    }

    protected void initUI() {
        // 初始化根容器
        sceneRoot = new Pane();
        sceneRoot.setPrefSize(800, 600);
        sceneRoot.setStyle("-fx-background-color: transparent;");

        // 加载背景图片
        Image backgroundImg;
        try {
            backgroundImg = new Image(Objects.requireNonNull(
                    getClass().getResourceAsStream("/assets/textures/CombatBackground.png")));
        } catch (Exception e) {
            System.err.println("背景图片加载异常: " + e.getMessage());
            backgroundImg = null;
        }

        if (backgroundImg != null) {
            ImageView background = new ImageView(backgroundImg);
            background.setFitWidth(1000);
            background.setFitHeight(750);
            sceneRoot.getChildren().add(background);
        }

        // 添加返回按钮
        addBackButton();
        // 添加地狱门按钮
        addHellPortalButton();
        // 添加关卡按钮
        addLevelButtons();

        getContentRoot().getChildren().add(sceneRoot);
    }

    // 添加返回按钮的方法
    private void addBackButton() {
        // 加载按钮音效（与GameScene保持一致）
        AudioPlayer audioPlayer = FXGL.getAudioPlayer();
        Sound clickSound = FXGL.getAssetLoader().loadSound("drop.wav");

        // 创建返回按钮（使用与其他按钮一致的风格）
        Button backBtn = createSingleImageButton(
                "/assets/textures/backbutton.png",  // 建议准备一个返回按钮图片
                "返回",
                0.1  // 缩放比例，可根据图片大小调整
        );

        // 设置按钮位置（左上角）
        StackPane.setAlignment(backBtn, Pos.TOP_LEFT);
        StackPane.setMargin(backBtn, new Insets(20, 0, 0, 20));  // 左上角边距

        // 绑定点击事件（返回GameScene）
        backBtn.setOnMouseClicked(e -> {
            // 移除这行，不在返回时隐藏玩家
            // comgame.scenes.GameScene.hidePlayer();
            audioPlayer.playSound(clickSound);  // 播放点击音效
            System.out.println("返回主场景");

            // 清除当前场景并切换到GameScene
            FXGL.getGameScene().clearUINodes();
            GameScene gameScene = new GameScene();
            FXGL.getGameScene().addUINode(gameScene.getSceneRoot());
            // 确保player实体可见
            if (comgame.scenes.GameScene.playerEntity != null) {
                comgame.scenes.GameScene.playerEntity.getViewComponent().setVisible(true);
            }
        });

        // 将按钮添加到场景
        sceneRoot.getChildren().add(backBtn);
    }

    // 复用GameScene中的按钮创建方法（保持风格一致）
    private Button createSingleImageButton(String imagePath, String text, double scale) {
        // 加载图片
        Image buttonImage = new Image(Objects.requireNonNull(getClass().getResourceAsStream(imagePath)));

        // 创建按钮（不设置文本，只显示图片）
        Button button = new Button();
        ImageView imageView = new ImageView(buttonImage);

        // 应用缩放
        imageView.setFitWidth(buttonImage.getWidth() * scale);
        imageView.setFitHeight(buttonImage.getHeight() * scale);
        button.setGraphic(imageView);

        // 设置按钮尺寸
        button.setPrefSize(imageView.getFitWidth(), imageView.getFitHeight());

        // 移除默认样式
        button.setStyle("-fx-background-color: transparent; -fx-border-color: transparent;");

        // 创建阴影效果（悬停时使用）
        DropShadow shadow = new DropShadow();
        shadow.setColor(Color.WHITE);
        shadow.setRadius(10);

        // 设置按钮状态变化事件
        button.setOnMouseEntered(e -> {
            button.setEffect(shadow);        // 添加阴影
            button.setOpacity(0.9);          // 轻微透明
        });

        button.setOnMouseExited(e -> {
            button.setEffect(null);          // 移除阴影
            button.setOpacity(1.0);          // 恢复不透明
        });

        button.setOnMousePressed(e -> {
            button.setOpacity(0.8);          // 点击时更透明
            button.setScaleX(0.98);          // 轻微缩小
            button.setScaleY(0.98);
        });

        button.setOnMouseReleased(e -> {
            button.setOpacity(0.9);          // 恢复悬停状态
            button.setScaleX(1.0);           // 恢复大小
            button.setScaleY(1.0);
        });

        return button;
    }

    public Pane getSceneRoot() {
        return sceneRoot;
    }
    
    // 添加地狱门按钮（右上角）
    private void addHellPortalButton() {
        AudioPlayer audioPlayer = FXGL.getAudioPlayer();
        Sound clickSound = FXGL.getAssetLoader().loadSound("drop.wav");
        Button hellPortalBtn = createSingleImageButton(
                "/assets/textures/NetherPortal.gif",
                "地狱门",
                0.5 // 缩放比例可根据图片实际大小调整
        );
        // 设置按钮位置（右上角）
        hellPortalBtn.setLayoutX(800 - hellPortalBtn.getPrefWidth() - 80); // 右边距30
        hellPortalBtn.setLayoutY(110); // 上边距30
        // 点击事件
        hellPortalBtn.setOnMouseClicked(e -> {
            audioPlayer.playSound(clickSound);
            System.out.println("点击了地狱门按钮");
            // 切换到祭坛场景
            FXGL.getGameScene().clearUINodes();
            AltarScene altarScene = new AltarScene();
            FXGL.getGameScene().addUINode(altarScene.getSceneRoot());
        });
        sceneRoot.getChildren().add(hellPortalBtn);
    }

    // 添加关卡按钮的方法
    private void addLevelButtons() {
        // 加载按钮音效
        AudioPlayer audioPlayer = FXGL.getAudioPlayer();
        Sound clickSound = FXGL.getAssetLoader().loadSound("drop.wav");

        // 关卡按钮坐标
        double[][] positions = {
            {650, 550},   // 1号关卡
            {550, 460},   // 2号关卡
            {450, 370},   // 3号关卡
            {350, 280},   // 4号关卡
            {250, 190},   // 5号关卡
            {150, 100},   // 6号关卡
            {250, 10}     // 7号关卡
        };

        for (int i = 1; i <= 7; i++) {
            Button levelBtn = createLevelButton(i, clickSound);
            // 设置每个按钮的位置
            levelBtn.setLayoutX(positions[i-1][0]);
            levelBtn.setLayoutY(positions[i-1][1]);
            
            // 如果关卡未解锁，设置灰色效果
            if (!levelData.isLevelUnlocked(i)) {
                levelBtn.setOpacity(0.5);
                levelBtn.setDisable(true);
            }
            
            sceneRoot.getChildren().add(levelBtn);
        }

        // 添加Fishing按钮（左下角）
        String fishingImagePath = "/assets/textures/Fishing.png";
        Button fishingBtn = new Button();
        Image fishingImg = new Image(Objects.requireNonNull(getClass().getResourceAsStream(fishingImagePath)));
        ImageView fishingView = new ImageView(fishingImg);
        fishingView.setFitWidth(128);
        fishingView.setFitHeight(128);
        fishingBtn.setGraphic(fishingView);
        fishingBtn.setPrefSize(100, 100);
        fishingBtn.setStyle("-fx-background-color: transparent; -fx-border-color: transparent;");
        fishingBtn.setLayoutX(200);
        fishingBtn.setLayoutY(500);
        fishingBtn.setOnMouseClicked(e -> {
            audioPlayer.playSound(clickSound);
            System.out.println("点击了钓鱼按钮");
            FXGL.getGameScene().clearUINodes();
            FishingScene fishingScene = new FishingScene();
            FXGL.getGameScene().addUINode(fishingScene.getSceneRoot());
        });
        // 悬停特效（与数字按钮一致）
        DropShadow fishingShadow = new DropShadow();
        fishingShadow.setColor(Color.WHITE);
        fishingShadow.setRadius(10);
        fishingBtn.setOnMouseEntered(e -> {
            fishingBtn.setEffect(fishingShadow);
            fishingBtn.setOpacity(0.9);
            fishingBtn.setScaleX(1.1);
            fishingBtn.setScaleY(1.1);
        });
        fishingBtn.setOnMouseExited(e -> {
            fishingBtn.setEffect(null);
            fishingBtn.setOpacity(1.0);
            fishingBtn.setScaleX(1.0);
            fishingBtn.setScaleY(1.0);
        });
        fishingBtn.setOnMousePressed(e -> {
            fishingBtn.setOpacity(0.8);
            fishingBtn.setScaleX(0.95);
            fishingBtn.setScaleY(0.95);
        });
        fishingBtn.setOnMouseReleased(e -> {
            fishingBtn.setOpacity(0.9);
            fishingBtn.setScaleX(1.1);
            fishingBtn.setScaleY(1.1);
        });
        sceneRoot.getChildren().add(fishingBtn);
    }
    
    // 创建关卡按钮
    private Button createLevelButton(int level, Sound clickSound) {
        String imagePath = String.format("/assets/textures/hud_number_%d.png", level);
        
        Button button = new Button();
        Image buttonImage = new Image(Objects.requireNonNull(getClass().getResourceAsStream(imagePath)));
        ImageView imageView = new ImageView(buttonImage);
        
        // 设置按钮大小
        imageView.setFitWidth(80);
        imageView.setFitHeight(80);
        button.setGraphic(imageView);
        button.setPrefSize(100, 100);
        
        // 设置按钮样式
        button.setStyle("-fx-background-color: transparent; -fx-border-color: transparent;");
        
        // 创建阴影效果
        DropShadow shadow = new DropShadow();
        shadow.setColor(Color.WHITE);
        shadow.setRadius(10);
        
        // 设置按钮交互效果
        button.setOnMouseEntered(e -> {
            if (!button.isDisabled()) {
                button.setEffect(shadow);
                button.setOpacity(0.9);
                button.setScaleX(1.1);
                button.setScaleY(1.1);
            }
        });
        
        button.setOnMouseExited(e -> {
            button.setEffect(null);
            button.setOpacity(button.isDisabled() ? 0.5 : 1.0);
            button.setScaleX(1.0);
            button.setScaleY(1.0);
        });
        
        button.setOnMousePressed(e -> {
            if (!button.isDisabled()) {
                button.setOpacity(0.8);
                button.setScaleX(0.95);
                button.setScaleY(0.95);
            }
        });
        
        button.setOnMouseReleased(e -> {
            if (!button.isDisabled()) {
                button.setOpacity(0.9);
                button.setScaleX(1.1);
                button.setScaleY(1.1);
            }
        });
        
        // 绑定点击事件，显示关卡详情UI
        button.setOnMouseClicked(e -> {
            if (!button.isDisabled()) {
                FXGL.getAudioPlayer().playSound(clickSound);
                System.out.println("点击了关卡按钮: " + level);
                showLevelDetail(level);
            }
        });
        
        return button;
    }
    
    // 显示关卡详情UI
    private void showLevelDetail(int level) {
        LevelData.LevelInfo levelInfo = levelData.getLevelInfo(level);
        if (levelInfo != null) {
            LevelDetailUI levelDetailUI = new LevelDetailUI(
                levelInfo,
                () -> {
                    // 挑战按钮回调
                    FXGL.getGameScene().clearUINodes();
                    new CombatScene(level, () -> {
                        // 战斗完成回调，返回地图
                        FXGL.getGameScene().clearUINodes();
                        MapScene mapScene = new MapScene();
                        FXGL.getGameScene().addUINode(mapScene.getSceneRoot());
                    });
                },
                () -> {
                    // 返回按钮回调
                    FXGL.getGameScene().clearUINodes();
                    MapScene mapScene = new MapScene();
                    FXGL.getGameScene().addUINode(mapScene.getSceneRoot());
                }
            );
            
            FXGL.getGameScene().addUINode(levelDetailUI);
        }
    }
}